﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>


//int main()//使用指针数组模拟实现二维数组
//{
//	//int* arr[10];//指针数组：存放指针的数组
//	int arr1[] = { 1,2,3,4,5 };
//	int arr2[] = { 2,3,4,5,6 };
//	int arr3[] = { 3,4,5,6,7 };
//	int* arr[3] = { arr1,arr2,arr3 };
//	for (int i = 0; i < 3; i++)
//	{
//		for (int j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}


//#include<string.h>
//int main()//字符指针变量
//{
//	const char* p = "hello world";//*p存放首元素
//	printf("%s\n", p);
//	printf("%s\n", "hello world");
//	
//	int len = strlen(p);
//	for (int i = 0; i < len; i++)
//	{
//		printf("%c", *(p + i));
//	}
//	return 0;
//}


//int main()//面试题
//{
//	char str1[] = "hello bit.";
//	char str2[] = "hello bit.";
//	const char* str3 = "hello bit.";
//	const char* str4 = "hello bit.";
//	if (str1 == str2)//数组是完全独立的空间
//		printf("str1 and str2 are same\n");
//	else
//		printf("str1 and str2 are not same\n");
//
//	if (str3 == str4)//常量字符串不能修改。内容相同的常量字符串保存一份
//		printf("str3 and str4 are same\n");
//	else
//		printf("str3 and str4 are not same\n");
//
//	return 0;
//}

//int main()//数组指针变量:存放的应该是数组的地址，能够指向数组的指针变量。
//{
//	int arr[10] = { 0 };
//	int(*p)[10] = &arr;//取出的是数组的地址	
//	//p是数组指针，指向的是数组
//	return 0;
//}
//int main()
//{
//	char arr[5];
//	char(*p)[5] = &arr;//char(* )[5] 数组指针类型
//	return 0;
//}


//void test(int(*p)[5], int r, int c)
//{
//	int i = 0;
//
//	int j = 0;
//	for (i = 0; i < r; i++)
//	{
//		for (j = 0; j < c; j++)
//		{
//			printf("%d ", *(*(p + i) + j));
//		}
//		printf("\n");
//	}
//}
//int main()//⼆维数组传参的本质(数组指针在二维数组中使用):传递的是第⼀⾏这个⼀维数组的地址，
//{
//	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6 },{3,4,5,6,7} };//二维数组的首元素就是第一行（一维数组），二维数组的数组名就是第一行的地址
//	//int(*p)[5] = &arr;
//	test(arr, 3, 5);
//	return 0;
//}

/*int Add(int x, int y)//函数指针变量
{
	return x + y;
}
int main()
{
	int arr[8] = { 0 };
	int(*pa)[8] = &arr;//pa是数组指针变量（）

	int (* pf)(int, int) = &Add;//pf是函数指针变量
	//int a = 10;
	//int b = 20;
	//int z = Add(a, b);
	//printf("%d\n", z);
	//printf("%p\n", &Add);//&函数名和函数名都表示函数地址
	//printf("%p\n", Add);

	return 0;
}*/
//int* test(char* s)
//{
//	return NULL;
//}
//int main()
//{
//	int* (*p)(char*) = &test;
//	return 0;
//}

//int Add(int x, int y)//函数指针变量
//{
//	return x + y;
//}
//int main()
//{
//	int (*pf)(int, int) = &Add;//pf是函数指针变量
//	int r = (*pf)(3, 3);
//	//int r = (pf)(3, 3);ok
//	printf("%d", r);
//	return 0;
//}


//int main()
//{
//	(*(void (*)())0)();//(void (*)()函数指针类型，函数调用1，将0强制类型转换位(void (*)()类型2，调用0地址处放的这个函数
//	void (*signal(int, void(*)(int)))(int);//signal(int, void(*)(int))函数声明。void(*)(int)函数指针类型
//	return 0;
//}

//typedef关键字： 是⽤来类型重命名的，可以将复杂的类型，简单化。
//typedef unsigned int uint;-----/将unsigned int 重命名为uint
//typedef int(*parr_t)[5];//parr_t等价于int(*)[5]
//int main()
//{
//	int arr[5] = { 0 };
//	int(*p)[5] = &arr;//p是变量的名字  int(*)[5]数组指针类型
//	parr_t p2 = &arr;
//	return 0;
//}

//void test(char* s)
//{
//
//}
//typedef void(*pf_t)(char*);//对函数指针类型重命名为pf_t
//int main()
//{
//	void(*pf)(char*) = test;
//	pf_t pf2 = test;
//	return 0;
//}